home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 1 / Amiga Tools.iso / egs-tools / egs_dev-disk / egsdemos / egsexamples / moregadgets / calc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-06  |  11.0 KB  |  371 lines

  1. /*
  2. *
  3. *  $
  4. *  $ FILE     : calc.c
  5. *  $ VERSION  : 1
  6. *  $ REVISION : 7
  7. *  $ DATE     : 08-Dec-93 18:11
  8. *  $
  9. *  $ Author   : mvk
  10. *  $
  11. *
  12. */
  13.  
  14. /*
  15.    Note: This is not a very good calulator, but you get the point.
  16. */
  17.  
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <exec/types.h>
  21. #include <egs/egsintui.h>
  22. #include <egs/egsgadbox.h>
  23. #include <proto/exec.h>
  24. #include <egs/proto/all.h>
  25.  
  26. /*
  27. **  Protos
  28. */
  29.  
  30.  
  31. BYTE  CreateGfx(void);
  32. BYTE  CreateWindow(void);
  33. void  UpdateDisplay(void);
  34.  
  35.  
  36. #define  ID_0        0x10
  37. #define  ID_1        0x11
  38. #define  ID_2        0x12
  39. #define  ID_3        0x13
  40. #define  ID_4        0x14
  41. #define  ID_5        0x15
  42. #define  ID_6        0x16
  43. #define  ID_7        0x17
  44. #define  ID_8        0x18
  45. #define  ID_9        0x19
  46. #define  ID_PLUS     0x21
  47. #define  ID_MINUS    0x22
  48. #define  ID_TIMES    0x23
  49. #define  ID_DIV      0x24
  50. #define  ID_POINT    0x31
  51. #define  ID_CLEAR    0x32
  52. #define  ID_EQUAL    0x33
  53.  
  54.  
  55. struct Library *EGSIntuiBase;
  56. struct Library *EGSGfxBase;
  57. struct Library *EGBBase;
  58.  
  59. struct EB_GadContextNode   *GadCon;
  60. struct EI_Window           *Win;
  61. struct EG_EFont            *Font;
  62.  
  63. struct EB_InfoBox    Display;
  64.  
  65. double   Arg1, Arg2, Res, Place;
  66. UBYTE    Valid, Oper;
  67.  
  68. BYTE  CreateGfx(void)
  69. {
  70.    struct EB_GadBox  *root, *a1, *a2, *b1, *b2, *b3, *b4, *b6;
  71.    BYTE  ret = 0;
  72.  
  73.    if (GadCon = EB_CreateGadContext(NULL, NULL, -1, -1))
  74.      {
  75.       root = EB_CreateVertiBox(GadCon);
  76.       EB_AddLastSon(root, EB_CreateVertiFill(GadCon, TRUE, 0));
  77.  
  78.       a1 = EB_CreateHorizBox(GadCon);
  79.       EB_AddLastSon(root, a1);
  80.       EB_AddLastSon(a1, EB_CreateHorizFill(GadCon, TRUE, 0));
  81.       EB_AddLastSon(a1, EB_CreateInfoBox(GadCon, &Display, Font, 6, 12, EI_JUSTIFY_RIGHT));
  82.       EB_AddLastSon(a1, EB_CreateHorizFill(GadCon, TRUE, 0));
  83.  
  84.       EB_AddLastSon(root, EB_CreateVertiFill(GadCon, TRUE, 0));
  85.  
  86.       a2 = EB_CreateVertiTable(GadCon);
  87.       EB_AddLastSon(root, a2);
  88.  
  89.       b6 = EB_CreateHorizBox(GadCon);
  90.       EB_AddLastSon(a2, b6);
  91.       EB_AddLastSon(b6, EB_CreateHorizFill(GadCon, TRUE, 0));
  92.       EB_AddLastSon(b6, EB_CreateTextAction(GadCon, " ", 0, EB_FILL_ALL));
  93.       EB_AddLastSon(b6, EB_CreateHorizFill(GadCon, TRUE, 0));
  94.       EB_AddLastSon(b6, EB_CreateTextAction(GadCon, " ", 0, EB_FILL_ALL));
  95.       EB_AddLastSon(b6, EB_CreateHorizFill(GadCon, TRUE, 0));
  96.       EB_AddLastSon(b6, EB_CreateTextAction(GadCon, " ", 0, EB_FILL_ALL));
  97.       EB_AddLastSon(b6, EB_CreateHorizFill(GadCon, TRUE, 0));
  98.       EB_AddLastSon(b6, EB_CreateTextAction(GadCon, "C", ID_CLEAR, EB_FILL_ALL));
  99.       EB_AddLastSon(b6, EB_CreateHorizFill(GadCon, TRUE, 0));
  100.  
  101.       EB_AddLastSon(a2, EB_CreateVertiFill(GadCon, TRUE, 0));
  102.  
  103.       b1 = EB_CreateHorizBox(GadCon);
  104.       EB_AddLastSon(a2, b1);
  105.       EB_AddLastSon(b1, EB_CreateHorizFill(GadCon, TRUE, 0));
  106.       EB_AddLastSon(b1, EB_CreateTextAction(GadCon, "7", ID_7, EB_FILL_ALL));
  107.       EB_AddLastSon(b1, EB_CreateHorizFill(GadCon, TRUE, 0));
  108.       EB_AddLastSon(b1, EB_CreateTextAction(GadCon, "8", ID_8, EB_FILL_ALL));
  109.       EB_AddLastSon(b1, EB_CreateHorizFill(GadCon, TRUE, 0));
  110.       EB_AddLastSon(b1, EB_CreateTextAction(GadCon, "9", ID_9, EB_FILL_ALL));
  111.       EB_AddLastSon(b1, EB_CreateHorizFill(GadCon, TRUE, 0));
  112.       EB_AddLastSon(b1, EB_CreateTextAction(GadCon, "/", ID_DIV, EB_FILL_ALL));
  113.       EB_AddLastSon(b1, EB_CreateHorizFill(GadCon, TRUE, 0));
  114.  
  115.       EB_AddLastSon(a2, EB_CreateVertiFill(GadCon, TRUE, 0));
  116.  
  117.       b2 = EB_CreateHorizBox(GadCon);
  118.       EB_AddLastSon(a2, b2);
  119.       EB_AddLastSon(b2, EB_CreateHorizFill(GadCon, TRUE, 0));
  120.       EB_AddLastSon(b2, EB_CreateTextAction(GadCon, "4", ID_4, EB_FILL_ALL));
  121.       EB_AddLastSon(b2, EB_CreateHorizFill(GadCon, TRUE, 0));
  122.       EB_AddLastSon(b2, EB_CreateTextAction(GadCon, "5", ID_5, EB_FILL_ALL));
  123.       EB_AddLastSon(b2, EB_CreateHorizFill(GadCon, TRUE, 0));
  124.       EB_AddLastSon(b2, EB_CreateTextAction(GadCon, "6", ID_6, EB_FILL_ALL));
  125.       EB_AddLastSon(b2, EB_CreateHorizFill(GadCon, TRUE, 0));
  126.       EB_AddLastSon(b2, EB_CreateTextAction(GadCon, "*", ID_TIMES, EB_FILL_ALL));
  127.       EB_AddLastSon(b2, EB_CreateHorizFill(GadCon, TRUE, 0));
  128.  
  129.       EB_AddLastSon(a2, EB_CreateVertiFill(GadCon, TRUE, 0));
  130.  
  131.       b3 = EB_CreateHorizBox(GadCon);
  132.       EB_AddLastSon(a2, b3);
  133.       EB_AddLastSon(b3, EB_CreateHorizFill(GadCon, TRUE, 0));
  134.       EB_AddLastSon(b3, EB_CreateTextAction(GadCon, "1", ID_1, EB_FILL_ALL));
  135.       EB_AddLastSon(b3, EB_CreateHorizFill(GadCon, TRUE, 0));
  136.       EB_AddLastSon(b3, EB_CreateTextAction(GadCon, "2", ID_2, EB_FILL_ALL));
  137.       EB_AddLastSon(b3, EB_CreateHorizFill(GadCon, TRUE, 0));
  138.       EB_AddLastSon(b3, EB_CreateTextAction(GadCon, "3", ID_3, EB_FILL_ALL));
  139.       EB_AddLastSon(b3, EB_CreateHorizFill(GadCon, TRUE, 0));
  140.       EB_AddLastSon(b3, EB_CreateTextAction(GadCon, "-", ID_MINUS, EB_FILL_ALL));
  141.       EB_AddLastSon(b3, EB_CreateHorizFill(GadCon, TRUE, 0));
  142.  
  143.       EB_AddLastSon(a2, EB_CreateVertiFill(GadCon, TRUE, 0));
  144.  
  145.       b4 = EB_CreateHorizBox(GadCon);
  146.       EB_AddLastSon(a2, b4);
  147.       EB_AddLastSon(b4, EB_CreateHorizFill(GadCon, TRUE, 0));
  148.       EB_AddLastSon(b4, EB_CreateTextAction(GadCon, "0", ID_0, EB_FILL_ALL));
  149.       EB_AddLastSon(b4, EB_CreateHorizFill(GadCon, TRUE, 0));
  150.       EB_AddLastSon(b4, EB_CreateTextAction(GadCon, ".", ID_POINT, EB_FILL_ALL));
  151.       EB_AddLastSon(b4, EB_CreateHorizFill(GadCon, TRUE, 0));
  152.       EB_AddLastSon(b4, EB_CreateTextAction(GadCon, "=", ID_EQUAL, EB_FILL_ALL));
  153.       EB_AddLastSon(b4, EB_CreateHorizFill(GadCon, TRUE, 0));
  154.       EB_AddLastSon(b4, EB_CreateTextAction(GadCon, "+", ID_PLUS, EB_FILL_ALL));
  155.       EB_AddLastSon(b4, EB_CreateHorizFill(GadCon, TRUE, 0));
  156.  
  157.       EB_AddLastSon(a2, EB_CreateVertiFill(GadCon, TRUE, 0));
  158.  
  159.       b1   = root;
  160.       root = EB_CreateMaster(GadCon, 0, 0);
  161.       EB_AddLastSon(root, b1);
  162.       b1   = root;
  163.       root = EB_CreateWindow(GadCon, 0, 0);
  164.       EB_AddLastSon(root, EB_CreateBorder(GadCon, b1, 0));
  165.  
  166.       if (Win)
  167.         {
  168.          root->MinWidth  = Win->Width;
  169.          root->MaxWidth  = Win->Width;
  170.          root->MinHeight = Win->Height;
  171.          root->MaxHeight = Win->Height;
  172.         }
  173.  
  174.       if (EB_ProcessGadBoxes(GadCon, root))
  175.         {
  176.          ret = 1;
  177.         }
  178.      }
  179.  
  180.    return ret;
  181. }
  182.  
  183. BYTE  CreateWindow(void)
  184. {
  185.    BYTE  ret = 0;
  186.  
  187.    if (CreateGfx())
  188.      {
  189.       GadCon->NewWin->Title              = "EGS Calculator Demo";
  190.       GadCon->NewWin->Flags             &= ~EI_SMART_REFRESH;
  191.       GadCon->NewWin->Flags             |= (EI_SIZEBBOTTOM | EI_SIMPLE_REFRESH);
  192.       GadCon->NewWin->IDCMPFlags        |= (EI_iCLOSEWINDOW | EI_iGADGETUP | EI_iSIZEVERIFY | EI_iNEWSIZE);
  193.       GadCon->NewWin->Bordef.SysGadgets |= (EI_WINDOWCLOSE | EI_WINDOWSIZE);
  194.       if (Win = EI_OpenWindow(GadCon->NewWin))
  195.         {
  196.          ret = 1;
  197.         }
  198.      }
  199.  
  200.    return ret;
  201. }
  202.  
  203. void  UpdateDisplay(void)
  204. {
  205.    char  buffer[64];
  206.  
  207.    sprintf(buffer, "%g", Res);
  208.  
  209.    EB_WriteInfoBox(&Display, Win, buffer);
  210. }
  211.  
  212. void  DoDigit(LONG digit)
  213. {
  214.    LONG  Digit;
  215.  
  216.    if (digit >= ID_0 && digit <= ID_9)
  217.      {
  218.       Digit = digit & 0x0f;
  219.  
  220.       if (!Valid)
  221.         {
  222.          Valid = 1;
  223.          Place = 0;
  224.          Res   = 0;
  225.         }
  226.  
  227.       if (Res > -100000000 && Res < 100000000)
  228.         {
  229.          if (Place)
  230.            {
  231.             Place *= 10;
  232.             Res   += (Digit / Place);
  233.            }
  234.          else
  235.            {
  236.             Res = Res * 10 + Digit;
  237.            }
  238.          if (Oper) Arg2 = Res;
  239.             else Arg1 = Res;
  240.         }
  241.  
  242.       UpdateDisplay();
  243.      }
  244. }
  245.  
  246. void  DoArithmetic(LONG arith)
  247. {
  248.    if (arith >= ID_PLUS && arith <= ID_DIV)
  249.      {
  250.       Oper  = arith;
  251.       Arg2 = Res;
  252.       Valid = 0;
  253.       UpdateDisplay();
  254.      }
  255. }
  256.  
  257. void  DoSpecial(LONG special)
  258. {
  259.    if (special >= ID_POINT && special <= ID_EQUAL)
  260.      {
  261.       if (special == ID_POINT)
  262.         {
  263.          if (!Valid)
  264.            {
  265.             Valid = 1;
  266.             Place = 0;
  267.             Res   = 0;
  268.            }
  269.          if (!Place) Place = 1;
  270.         }
  271.  
  272.       if (special == ID_CLEAR)
  273.         {
  274.          Res   = 0;
  275.          Arg1  = 0;
  276.          Arg2  = 0;
  277.          Valid = 0;
  278.          Place = 0;
  279.         }
  280.  
  281.       if (special == ID_EQUAL)
  282.         {
  283.          if (Oper == ID_PLUS)  Res = Arg1 + Arg2;
  284.          if (Oper == ID_MINUS) Res = Arg1 - Arg2;
  285.          if (Oper == ID_TIMES) Res = Arg1 * Arg2;
  286.          if (Oper == ID_DIV)   Res = Arg1 / Arg2;
  287.          Arg1 = Res;
  288.          Oper = 0;
  289.          Valid = 0;
  290.         }
  291.       UpdateDisplay();
  292.      }
  293. }
  294.  
  295. main()
  296. {
  297.    struct EI_EIntuiMsg  *IMsg;
  298.    struct EI_Gadget     *TempGad;
  299.    BYTE  quit = 0;
  300.  
  301.    if (EGSIntuiBase = OpenLibrary("egsintui.library", 0))
  302.      {
  303.       if (EGSGfxBase = OpenLibrary("egsgfx.library", 0))
  304.         {
  305.          if (EGBBase = OpenLibrary("egsgadbox.library", 0))
  306.            {
  307.             if (Font = EG_OpenFont(EI_GetPrefFont(1)))
  308.               {
  309.                if (CreateWindow())
  310.                  {
  311.                   UpdateDisplay();
  312.                   while (!quit)
  313.                     {
  314.                      WaitPort(Win->UserPort);
  315.                      if (IMsg = (struct EI_EIntuiMsg *)GetMsg(Win->UserPort))
  316.                        {
  317.                         if (IMsg->Class == EI_iCLOSEWINDOW)
  318.                           {
  319.                            quit = 1;
  320.                           }
  321.                         if (IMsg->Class == EI_iGADGETUP)
  322.                           {
  323.                            if (TempGad = (struct EI_Gadget *)IMsg->IAddress)
  324.                              {
  325.                               if ((TempGad->GadgetID & 0xf0) == 0x10)
  326.                                 {
  327.                                  DoDigit(TempGad->GadgetID);
  328.                                 }
  329.                               if ((TempGad->GadgetID & 0xf0) == 0x20)
  330.                                 {
  331.                                  DoArithmetic(TempGad->GadgetID);
  332.                                 }
  333.                               if ((TempGad->GadgetID & 0xf0) == 0x30)
  334.                                 {
  335.                                  DoSpecial(TempGad->GadgetID);
  336.                                 }
  337.                              }
  338.                           }
  339.                         if (IMsg->Class == EI_iSIZEVERIFY)
  340.                           {
  341.                            EI_RemoveGList(Win, GadCon->First, GadCon->Num);
  342.                            EB_DeleteGadContext(GadCon);
  343.                            GadCon = NULL;
  344.                           }
  345.                         if (IMsg->Class == EI_iNEWSIZE)
  346.                           {
  347.                            EI_LockIntuition();
  348.                            CreateGfx();
  349.                            if (GadCon)
  350.                              {
  351.                               EI_AddGList(Win, GadCon->First, GadCon->Num);
  352.                              }
  353.                            EI_UnlockIntuition();
  354.                            UpdateDisplay();
  355.                           }
  356.                         ReplyMsg((struct Message *)IMsg);
  357.                        }
  358.                     }
  359.                  }
  360.                EG_CloseFont(Font);
  361.               }
  362.             if (Win) EI_CloseWindow(Win);
  363.             if (GadCon) EB_DeleteGadContext(GadCon);
  364.             CloseLibrary(EGBBase);
  365.            }
  366.          CloseLibrary(EGSGfxBase);
  367.         }
  368.       CloseLibrary(EGSIntuiBase);
  369.      }
  370. }
  371.